home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CD ROM Paradise Collection 4
/
CD ROM Paradise Collection 4 1995 Nov.iso
/
science
/
fastmap.zip
/
TABLE.C
< prev
next >
Wrap
C/C++ Source or Header
|
1993-04-01
|
12KB
|
445 lines
/* Written by Dave Curtis, modified by Gary Williams, HGMP, Harrow, UK */
#ifndef __PYRAMID__
#define __PYRAMID__ 0
#endif
#include <stdio.h>
#include <math.h>
#if ! __PYRAMID__
#include <string.h>
#include <stdlib.h> /* prototype for exit() */
#else
char *index();
#define strchr(s,c) index(s,c)
#endif
#ifndef max
#define max(x,y) (((x)>(y))?(x):(y))
#endif
#define MAXPEDS 100
#define MAXLODS 100
#define MIN_RF_TO_FIT 0.009
#define MAX_RF_TO_FIT 0.41
/* for FASTMAP */
#ifndef TRUE
#define TRUE 1
#define FALSE 0
#endif
int TABLE=TRUE,HOMOG=FALSE,GRAPH=FALSE,BTEST=FALSE,INPUT=FALSE,ATEST=FALSE;
#ifndef __ZTC__
#define __ZTC__ 0
#else
unsigned _stack=60000;
#endif
#if ! __ZTC__
/* if library does not have strupr() and strstr() */
#include <ctype.h>
char *strupr(s)
char *s;
{
while (*s)
{
if (isascii(*s) && islower(*s))
*s=toupper(*s);
++s;
}
}
char *strstr(s,t)
char *s, *t;
{
while ((s=strchr(s,*t))!=0)
if (!strncmp(s,t,strlen(t))) return s;
else ++s;
return 0;
}
#endif /* __ZTC__ */
error(e,s1,s2)
int e;
char *s1,*s2;
{
fprintf(stderr,"%s%s\n\n",s1,s2);
exit(e);
return 0;
}
usage()
{
#ifdef UNIX
printf("\nRun on FILENAME.RES (OUTFILE.DAT) file from MLINK or LINKMAP\n\n\
Usage:\n\
TABLE [-g -h -b -i -a] filename.res\n\n\
-g -> make .grp file for EASIPLOT\n\
-h -> make .hom file for HOMOG\n\
-b -> make .bte file for BTEST\n\
-i -> make .inp file for FASTMAP\n\n\
-a -> add A-test results to table and graph files\n\n\
(files for HOMOG and BTEST will only be created if results are\n\
available for multiple pedigrees)\n\n");
#else
printf("\nRun on FILENAME.RES (OUTFILE.DAT) file from MLINK or LINKMAP\n\n\
Usage:\n\
TABLE filename.res [/g /h /b /i /a]\n\n\
/g -> make .GRP file for EASIPLOT\n\
/h -> make .HOM file for HOMOG\n\
/b -> make .BTE file for BTEST\n\
/i -> make .INP file for FASTMAP\n\n\
/a -> add A-test results to table and graph files\n\n\
(files for HOMOG and BTEST will only be created if results are\n\
available for multiple pedigrees)\n\n");
#endif
return 0;
}
int LINKMAP=0,MLINK=1,basepoints=0;
float kosambi(theta)
double theta;
{
return (theta>0.49 ? 70.0 : 25*log((1+2*theta)/(1-2*theta)));
}
#define MAXTHETAS 10
main(argc,argv)
int argc;
char *argv[];
{
FILE *fi,*fo,*fg;
float logli0[MAXPEDS],theta[MAXLODS][MAXTHETAS],*lod[MAXPEDS],
totlod[MAXLODS],fdum,f,
theta0[MAXTHETAS],almax[MAXLODS],amax[MAXLODS];
float distance[MAXLODS];
char filename[81],s[81],*ptr,title[81],famid[MAXPEDS+1][31];
int i,nval,nfams,idum,j,lorder[MAXTHETAS],testlocus,locusnum,rrvary,nloci;
if (argc<2) {usage();error(1,"","");}
strcpy(filename,argv[1]);
while (--argc>1)
{
strupr(argv[argc]);
if (!strcmp(argv[argc],"-G") || !strcmp(argv[argc],"/G")) GRAPH=TRUE;
else if (!strcmp(argv[argc],"-H") || !strcmp(argv[argc],"/H")) HOMOG=TRUE;
else if (!strcmp(argv[argc],"-B") || !strcmp(argv[argc],"/B")) BTEST=TRUE;
else if (!strcmp(argv[argc],"-I") || !strcmp(argv[argc],"/I")) INPUT=TRUE;
else if (!strcmp(argv[argc],"-A") || !strcmp(argv[argc],"/A")) ATEST=TRUE;
else {usage();error(2,"Bad switch: ",argv[argc]);}
}
#ifndef UNIX
if (!strchr(filename,'.'))
strcat(filename,".res");
#endif
fi=fopen(filename,"r");
if (!fi) error(2,"Could not open ",filename);
#ifdef UNIX
if (!strchr(filename,'.'))
strcat(filename,".");
#endif
nfams=nval=0;
*title='\0';
strcpy(title,"\n");
while (fgets(s,81,fi))
{
strupr(s);
if ((ptr=strstr(s,"MLINK"))!=0 && strchr(s,':'))
strcpy(title,ptr);
if ((ptr=strstr(s,"LINKMAP"))!=0)
{
if (strchr(s,':'))
strcpy(title,ptr);
MLINK=0;
LINKMAP=1;
}
if (LINKMAP && strstr(s,"TEST LOCUS"))
sscanf(strchr(s,':'),": %d",&testlocus);
/* linkmap */
if (MLINK && strstr(s,"VARY"))
{
sscanf(strchr(s,':'),": %d",&rrvary);
--rrvary;
}
if (strstr(s,"ORDER"))
{
nloci=sscanf(strchr(s,':'),": %d %d %d %d %d %d %d %d %d %d",
&lorder[0],&lorder[1],&lorder[2],&lorder[3],&lorder[4],&lorder[5],
&lorder[6],&lorder[7],&lorder[8],&lorder[9]);
for (locusnum=0;locusnum<MAXTHETAS;++locusnum)
if (lorder[locusnum]==testlocus) break;
break;
}
}
while (fgets(s,81,fi))
{
strupr(s);
if (LINKMAP && (ptr=strstr(s,"LOCUS ORDER"))!=0)
{
sscanf(strchr(s,':'),": %d %d %d %d %d %d %d %d %d %d",
&lorder[0],&lorder[1],&lorder[2],&lorder[3],&lorder[4],&lorder[5],
&lorder[6],&lorder[7],&lorder[8],&lorder[9]);
for (locusnum=0;locusnum<MAXTHETAS;++locusnum)
if (lorder[locusnum]==testlocus) break;
}
if ((ptr=strstr(s,"THETAS"))!=0)
{
if (basepoints==0)
{
++basepoints;
sscanf(ptr,"THETAS %f %f %f %f %f %f %f %f %f %f ",
&theta0[0],&theta0[1],&theta0[2],&theta0[3],&theta0[4],&theta0[5],
&theta0[6],&theta0[7],&theta0[8],&theta0[9]);
while(fgets(s,81,fi),strupr(s),(ptr=strstr(s,"LIKE"))==0) ;
fgets(s,81,fi);
while (fgets(s,81,fi),
sscanf(s," %29s %f %f",famid[nfams],&fdum,&logli0[nfams])==3)
if (++nfams>MAXPEDS) error(4,"Too many pedigrees - increase MAXPEDS","");
if (!nfams)
{
while (fgets(s,81,fi),strupr(s),
!strstr(s,"TOTALS")) ;
sscanf(s,"TOTALS %f %f ",&fdum,&logli0[0]);
}
}
else
{
if (basepoints==1)
{
++basepoints;
for (i=0;i<(nfams?nfams:1);++i)
{
lod[i]=calloc(MAXLODS,sizeof(float));
if (!lod[i]) error(5,"Out of memory - try decreasing MAXLODS","");
}
}
sscanf(ptr,"THETAS %f %f %f %f %f %f %f %f %f %f ",
&theta[nval][0],&theta[nval][1],&theta[nval][2],&theta[nval][3],
&theta[nval][4],&theta[nval][5],&theta[nval][6],&theta[nval][7],
&theta[nval][8],&theta[nval][9]);
if (MLINK) distance[nval]=kosambi(theta[nval][0]);
else if (locusnum==0) distance[nval]= -kosambi(theta[nval][0]);
else
for (distance[nval]=0,i=0;i<locusnum;++i)
distance[nval]+=kosambi(theta[nval][i]);
totlod[nval]=0.0;
while(fgets(s,81,fi),strupr(s),(ptr=strstr(s,"LIKE"))==0) ;
fgets(s,81,fi);
for (i=0;fgets(s,81,fi),
sscanf(s," %29s %f %f",famid[i],&fdum,&f)==3;++i)
{
lod[i][nval]=f-logli0[i];
totlod[nval]+=lod[i][nval];
}
if (!nfams)
{
while (fgets(s,81,fi),strupr(s),
!strstr(s,"TOTALS")) ;
sscanf(s,"TOTALS %f %f ",&fdum,&lod[0][nval]);
lod[0][nval]-=logli0[0];
}
++nval;
}
}
}
fclose(fi);
if (MLINK)
{
for (i=0;i<nfams;++i)
lod[i][nval]=0;
totlod[nval]=0;
theta[nval][rrvary]=0.5;
++nval;
}
for (i=0;i<nval;++i)
{
if (totlod[i]<-99.0) totlod[i]= -99.0;
for (j=0;j<nfams;++j)
if (lod[j][i]<-99.0) lod[j][i]= -99.0;
}
if (ATEST && nfams>1)
{
for (i=0;i<nval;++i)
{
float alpha,alod;
amax[i]=0.0;
almax[i]=0.0;
if (i<nval-1)
for (alpha=0.05;alpha<1.01;alpha+=0.05)
{
alod=0.0;
for (j=0;j<nfams;++j)
alod+=log10(alpha*pow(10.0,lod[j][i])+1-alpha);
if (alod>almax[i])
{
almax[i]=alod;
amax[i]=alpha;
}
}
}
}
if (TABLE)
{
strcpy(strchr(filename,'.'),".tab");
fo=fopen(filename,"w");
if (!fo) error(2,"Could not open ",filename);
if (*title) fprintf(fo,"%s\n",title);
if (LINKMAP)
{
for (j=0;j<nloci-1;++j)
{
fprintf(fo,"theta ");
for (i=0;i<nval-1;++i)
fprintf(fo,"%8.3f%s",theta[i][j],(i==nval-2)?"\n":"");
}
fprintf(fo,"cM ");
for (i=0;i<nval-1;++i)
fprintf(fo,"%8.3f%s",distance[i],(i==nval-2)?"\n":"");
}
else
{
fprintf(fo,"theta ");
for (i=0;i<nval-1;++i)
fprintf(fo,"%8.3f%s",theta[i][rrvary],(i==nval-2)?"\n":"");
fprintf(fo,"cM ");
for (i=0;i<nval-1;++i)
fprintf(fo,"%8.3f%s",kosambi(theta[i][rrvary]),(i==nval-2)?"\n":"");
}
for (j=0;j<nfams;++j)
{
fprintf(fo,"%6.6s ",famid[j]);
for (i=0;i<nval-1;++i)
fprintf(fo,"%8.3f%s",lod[j][i],
(i==nval-2)?(nfams==1?"\n\n\n":"\n"):"");
}
if (nfams>1) for (i=0;i<nval-1;++i)
fprintf(fo,"%s%8.3f%s",i?"":"total ",
totlod[i],(i==nval-2)?"\n\n\n":"");
if (ATEST && nfams>1)
{
for (i=0;i<nval-1;++i)
fprintf(fo,"%s%8.3f%s",i?"":"alpha ",
amax[i],(i==nval-2)?"\n":"");
for (i=0;i<nval-1;++i)
fprintf(fo,"%s%8.3f%s",i?"":"A-lod ",
almax[i],(i==nval-2)?"\n\n\n":"");
}
fclose(fo);
}
if (INPUT && !LINKMAP)
{
strcpy(strchr(filename,'.'),".inp");
fo=fopen(filename,"w");
if (!fo) error(2,"Could not open ",filename);
for (j=0;j<nfams;++j)
{
/*
fprintf(fo,"%6.3f 0.01 %6.3f 0.2 %6.3f 0.4\n",
lod[j][2],lod[j][5],lod[j][7]);
*/
{
for (i=0;i<nval;++i)
if (theta[i][rrvary]>=MIN_RF_TO_FIT && theta[i][rrvary]<=MAX_RF_TO_FIT)
fprintf(fo,"%6.3f %7.4f ",theta[i][rrvary],max(lod[j][i],-99.0));
fprintf(fo,"\n");
}
}
fclose(fo);
}
if (GRAPH)
{
strcpy(strchr(filename,'.'),".grp");
fg=fopen(filename,"w");
if (!fg) error(2,"Could not open ",filename);
fprintf(fg,"PARMS:L\n");
fprintf(fg,"TITLE:%s",title);
fprintf(fg,"TITLEV:lod\nTITLEG:%s\nTITLEG:%s\nTITLEG:%s",
LINKMAP?"cM":"theta",
LINKMAP?"cM":"theta\nTITLEG:cM",
nfams==1?"lod score":"total");
if (nfams>1) for (j=0;j<nfams;++j)
fprintf(fg,"\nTITLEG:ped %s",famid[j]);
if (ATEST && nfams>1) fprintf(fg,"\nTITLEG:alpha\nTITLEG:atotal");
if (LINKMAP)
for (i= -1;i<nval;++i)
{
fprintf(fg,"\n%f,%f",i==-1?-70:distance[i],
(i==-1)?0.0:totlod[i]);
if (nfams>1) for (j=0;j<nfams;++j)
fprintf(fg,",%f",(i==-1)?0.0:lod[j][i]);
if (ATEST && nfams>1)
fprintf(fg,",%f,%f",(i==-1)?0.0:amax[i],(i==-1)?0.0:almax[i]);
}
else
for (i=0;i<nval;++i)
{
fprintf(fg,"\n%f,%f,%f",theta[i][rrvary],
kosambi(theta[i][rrvary]),
totlod[i]);
if (nfams>1) for (j=0;j<nfams;++j)
fprintf(fg,",%f",lod[j][i]);
if (ATEST && nfams>1)
fprintf(fg,",%f,%f",amax[i],almax[i]);
}
fprintf(fg,"\nDATATYPE:XY1,%d,-1\n",LINKMAP?2:3);
if (nfams>1) for (j=1;j<=nfams;++j)
fprintf(fg,"DATATYPE:XY1,%d,-%d\n",j+2+(LINKMAP?0:1),j+1+(LINKMAP?0:1));
fclose(fg);
}
if (HOMOG && nfams>1)
{
strcpy(strchr(filename,'.'),".hom");
fo=fopen(filename,"w");
if (!fo) error(2,"Could not open ",filename);
fprintf(fo,"%4d\n1\n",nval-1);
for (i=0;i<nval-1;++i)
fprintf(fo,"%6.3f%s",MLINK?theta[i][rrvary]:distance[i],(i==nval-2)?"\n":" ");
for (j=0;j<nfams;++j)
{
fprintf(fo,"1\n");
for (i=0;i<nval-1;++i)
fprintf(fo,"%6.3f%s",lod[j][i],(i==nval-2)?"\n":" ");
}
fprintf(fo,"0\n0\n");
fclose(fo);
}
if (MLINK && BTEST && nfams>1)
{
strcpy(strchr(filename,'.'),".bte");
fo=fopen(filename,"w");
if (!fo) error(2,"Could not open ",filename);
fprintf(fo,"50\n%d\n",nfams);
fprintf(fo,"%d\n",theta[0][rrvary]?nval-1:nval-2);
for (i=theta[0][rrvary]?0:1;i<nval;++i)
fprintf(fo,"%6.3f%s",theta[i][rrvary],(i==nval-1)?"\n":"");
for (j=0;j<=nfams;++j)
for (i=theta[0][rrvary]?0:1;i<nval;++i)
if (lod[j][i]<-9.9) lod[j][i]= -9.9;
for (j=0;j<nfams;++j)
{
for (i=theta[0][rrvary]?0:1;i<nval;++i)
fprintf(fo,"%6.3f%s",lod[j][i],(i==nval-1)?"\n":"");
}
fclose(fo);
}
return 0;
}